/*********************************************************************************
 *      Copyright:  (C) 2020 makun<1394987689@qq.com>
 *                  All rights reserved.
 *
 *       Filename:  signal.c
 *    Description:  This file 
 *                 
 *        Version:  1.0.0(2020年03月20日)
 *         Author:  makun <1394987689@qq.com>
 *      ChangeLog:  1, Release initial version on "2020年03月20日 14时19分06秒"
 *                 
 ********************************************************************************/
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
int     g_sigstop = 0;

void signal_stop(int signum)
{

    if( SIGTERM == signum )
    {
        printf("SIGTERM signal detected\n");
    }
    else if( SIGALRM == signum )
    {
        printf("SIGALRM signal detected\n");
        g_sigstop = 1;
    }
}
void signal_code(int signum)
{
    if(SIGBUS == signum)
    {
        printf("SIGBUS signal detected\n");
    }
    else if(SIGILL == signum)
    {
        printf("SIGILL signal detected\n");
    }
    else if(SIGSEGV == signum)
    {
        printf("SIGSEGV signal detected\n");
    }
    exit(-1);
}
/*void signal_user(int signum)
{
    if(SIGUSR1 ==signum)
    {
        printf("SIGUSR1 signal detected\n");
    }
    else if(SIGUSR2 == signum)
    {
        printf("SIGUSR2 signal detected\n");
    }
        g_sigstop = -1;
}

*/
int main (int argc, char **argv)
{
    char    *ptr=NULL;
    

    signal(SIGTERM,signal_stop);
    /*安装SIGTERM信号，SIGTERM这是由kill（1）命令发送的系统默认终止信号，由于该信号是由应用程序捕获的使用SIGTERM也让程序有机会在退出之前做好清理工作，从而优雅的终止*/
    signal(SIGALRM,signal_stop);
    /*安装SIGALRM,SIGALRM,当用alarm函数设置的定时器超时时，产生此信号，若由setitime（2）函数设置的间隔时间已经超时时，也产生此信号。*/ 
    signal(SIGBUS,signal_code);
    /*指示一个实现定义的硬件故障，当出现某些类型的的内存故障时，实现常常产生此种信号*/
    signal(SIGILL,signal_code);
    /* 此信号表示进程已执行一条非法硬件指令 */
    signal(SIGSEGV,signal_code);
    /*指示进程进行了一次无效的内存引用（通常说明程序有错，比如访问了一个未初始的指针）*/ 


    printf("program start running for 20 seconds...\n");
    alarm(20);
    while(!g_sigstop)
    {
        ;
    }
    printf("program start stop running...\n");
    printf("invalid pointer operator will raise SIGSEGV signal\n");

    *ptr = 'h';

    return 0;
}


